/*
 * @(#)ImgFile.java Time: 2013-1-3
 *
 * Copyright 2013 xuedou.com All rights reserved.
 */

package xuedou.skymoni.util;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import javax.imageio.ImageIO;

/**
 *<pre>类说明</pre>
 *<b>功能描述：</b>
 * 用来得到一张图片的所有的信息，继承自UploadFile
 * ImgFile的具体方法可以得到一张图片的大小，判断一张图片是否为真实的图片，
 * 路径是否合法，获取图片的名字，获取图片的后缀名等相关于图片的信息
 * @author  meiguanghui meiguanghui@xuedou.com
 * @version 1.0, 2013-1-4
 */
public class ImgFile extends File {
	
	private static final long serialVersionUID = 1L;
	   
	/**
	 * 图片的魔法信息，用作获取图片的真是后缀名
	 * @author weidan
	 *
	 */
	   public enum MagicNum {
			  //通过括号赋值,而且必须带有一个参构造器和一个属性跟方法，否则编译出错
		        //赋值必须都赋值或都不赋值，不能一部分赋值一部分不赋值；如果不赋值则不能写构造器，赋值编译也出错
			     I_424d("bmp"), I_5349("fits"),I_4749("gif"),I_474b("gks"),I_01da("rgb"),I_f100("itc"),I_ffd8("jpg"),I_4949("nif"),
			     I_5649("pm"),I_8950("png"),I_2521("ps"),I_59a6("ras"),I_xxxx("tga"),I_4d4d("tif"),I_6769("xcf"),I_2346("fig"),I_2f2a("xpm");
		        
		        private final String value;

		        //构造器默认也只能是private, 从而保证构造函数只能在内部使用
		        MagicNum(String value) {
		            this.value = value;
		        }
		        
		        public String getValue() {
		            return value;
		        }

		    }

	   /**
	    * 构造方法   根据 parent 抽象路径名和 child 路径名字符串创建一个新 ImgFile 实例。
	    * 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 
                            如果 parent 为 null，则创建一个新的 ImgFile 实例，这与调用给定 child 路径名字符串的单参数 ImgFile 构造方法的效果一样。 
                          否则，parent 抽象路径名用于表示目录，child 路径名字符串用于表示目录或文件。如果 child 路径名字符串是绝对路径名，则用与系统有关的方式将它转换为一个相对路径名。如果 parent 是空抽象路径名，则通过将 child 转换为抽象路径名，并根据与系统有关的默认目录解析结果来创建新的 ImgFile 实例。否则，将每个路径名字符串转换为一个抽象路径名，并根据父抽象路径名解析子抽象路径名。 
	    * @param parent 父抽象路径名
	    * @param child 子路径名字符串
	    * @throws SkyException
	    */
    	public ImgFile(File parent, String child) throws SkyException {	
		super(parent, child);
		
			//如果路径检查不合法
		    	if(!srcIsLegal(child)){	    		
						throw new  SkyException("路径不合法");			
		    	}
	     }

    /**
     * 检查文件路径是否合法
     * @param src 文件路径
     * @return
     */
	  private  boolean srcIsLegal(String src){
		  
		  //判断字符串是否合法
		  if(null==src||"".equals(src)){
			  return false;
		  }
		  
		  //判断路径的文件是否存在
		  File f = new File(src);
		  if(!f.exists()){
			  return false;
		  }
		  return true;
	  }  
	  
	  /**
	   * 获取到图片的名字，不包括后缀名，比图说lanyangyang.jpg得到的就是lanyangyang.jpg
	   * @return  图片默认的名字，不带后缀名
	   */
	  public String getDefaultName(){
		  String name =  this.getName();	 
	      return name.substring(0,name.indexOf("."));
	  }
	  
	  /**
	   * 获取图片的后缀名
	   * 比如说lanyangyang.jpg获取到的就是jpg
	   * @return 图片后缀名
	   */
	  public String getSuffix(){
		  String name =  this.getName();	 
		  return name.substring(name.indexOf(".")+1,name.length());	  
	  }
	   
	  /**
	   * 获取图片的实际所占的内存的大小
	   * 比如说有一张图片的大小事56k，该方法得到的就是56.00k
	   * @return double类型的数据，保留两位小数
	   */
      public double getSize(){	  
    	  long size = this.length();
    	  Double sizeDouble = new Double(size); 
    	  double res = sizeDouble/(new Double(1024));
    	  
    	  //四舍五入保留两位小数
    	  BigDecimal   b   =   new   BigDecimal(res);  
    	  double  result = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();   
    	  return result;
	   }
		
      /**
       * 判断是否是一张图片,如果是一个文本文件如a.txt修改为a.jpg那么判断的到的是一张假图片。
       * 如果有一张图片是b.gif我们没有经过处理，直接修改后缀名为b.jpg那么我们如果将b.jpg得到的是一张假的jpg图片
       * 如果拿b.gif去判断，那么是一张真的gif图片
       */
	  
	   public  boolean isImage() { 	   
		   //先查看是不是一张图片
          if (!this.exists()) { 
              return false; 
          } 
          BufferedImage img = null; 
          try { 
              img = ImageIO.read(this); 
              if (img == null || img.getWidth(null) <= 0 || img.getHeight(null) <= 0) { 
                  return false; 
              } 
          } catch (Exception e) { 
              return false; 
          } finally { 
              img = null; 
          } 
          
          //查看图片的格式是否正确
           //1.获取图谱按的后缀名      
             String imgName =this.getName().substring(this.getName().lastIndexOf(".")+1);
             boolean flag = imgName.equalsIgnoreCase(getImgFormat(this.getPath()));        
          return flag;
      } 
  
    /**
	 * 获取图片的真实的后缀名，比如说，如果原来有一张图片是lanyangyang.gif，我们人为的将图片改为lanyangyang.jpg那我们得到的结果是gif而不是jpg
	 * @param ImageSourcePath 图片的路径
	 * @return  图片的后缀名
	 */
    public static String getImgFormat(String ImageSourcePath) {
 
         //获取到图片的文件流
    	byte[] bt = null;
		try {
			File image = new File(ImageSourcePath);
			InputStream is = new FileInputStream(image);
			bt = new byte[2];
			is.read(bt);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        
        StringBuilder stringBuilder = new StringBuilder();
        if (bt == null || bt.length <= 0) {
            return null;
        }
        for (int i = 0; i < bt.length; i++) {
            int v = bt[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
         
        return MagicNum.valueOf("I_"+stringBuilder.toString()).getValue();
    }
      
	/**
	 * 获取到需要的路径
	 * @return
	 */
    public String getNeedPath(){
    	String path = this.getPath();
    	//将path中的路径改为java能识别的
    	String newPath = path.replaceAll("\\\\", "/");
    	return newPath;
    }
    
    
    
    
    
    
    
    
}
